home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1994 / 12 / 02 / tips.ampk / Tips & Tricks / Lock2AppMenu / Lock2AppMenu.mod < prev    next >
Encoding:
Text File  |  1995-06-01  |  5.5 KB  |  157 lines

  1. MODULE Lock2AppMenu;   (* Lock on/off im Tools-Menü der Workbench *)
  2.  
  3. FROM SYSTEM     IMPORT CAST,
  4.             ADR,
  5.             ADDRESS,
  6.             TAG;
  7. FROM Arts     IMPORT kickVersion;
  8. FROM DosD     IMPORT FileHandlePtr,
  9.             newFile,
  10.             SysTags;
  11. FROM DosL     IMPORT Open,
  12.             System;
  13. FROM ExecD     IMPORT MsgPortPtr,
  14.             MemReqs,
  15.             MemReqSet;
  16. FROM ExecL     IMPORT FindPort,
  17.             WaitPort,
  18.             PutMsg,
  19.             GetMsg,
  20.             ReplyMsg,
  21.             CopyMem,
  22.             AllocVec,
  23.             FreeVec;
  24. FROM ExecSupport IMPORT CreatePort,
  25.             DeletePort,
  26.             IsMsgPortEmpty;
  27. FROM String     IMPORT BStrToStr,
  28.             Insert;
  29. FROM UtilityD     IMPORT tagEnd;
  30. FROM WorkbenchD     IMPORT AppMenuItemPtr,
  31.             AppMessage,
  32.             AppMessagePtr,
  33.             MType;
  34. FROM WorkbenchL     IMPORT AddAppMenuItemA,
  35.             RemoveAppMenuItem;
  36.  
  37. CONST
  38.   OS2 = 36;
  39.   StopData = CAST(LONGINT, "Stop");
  40.  
  41. VAR
  42.   ActivePortPtr,        (* Message-Port des bereits aktiven Programms *)
  43.   PortPtr: MsgPortPtr;        (* eigener Message-Port *)
  44.   onPtr,            (* "Lock on"-Menü *)
  45.   offPtr: AppMenuItemPtr;    (* "Lock off"-Menü *)
  46.   AppMsgPtr: AppMessagePtr;    (* Application- oder Stop-Nachricht *)
  47.   ok: BOOLEAN;            (* Fehler bei Anweisung? *)
  48.  
  49. PROCEDURE Launch;   (* Menü einrichten und überwachen *)
  50. PROCEDURE ExecuteLock;   (* Lock durchführen *)
  51. VAR
  52.   c: LONGINT;                (* Zählvariable *)
  53.   ShellPtr: FileHandlePtr;              (* Ausgabefenster *)
  54.   LockArg,                (* Befehl für System-Anweisung *)
  55.   VolName: ARRAY [0..255] OF CHAR;    (* Datenträgername *)
  56.   VolNamePtr: POINTER TO CHAR;        (* Zeiger darauf *)
  57.   ASynch: BOOLEAN;            (* asynchron oder nicht? *)
  58.   tagbuf: ARRAY [0..12] OF LONGINT;    (* Puffer für TAG-Funktion *)
  59.   Error: LONGINT;                (* Fehlernummer der System-Anweisung *)
  60. BEGIN
  61.   ShellPtr := Open(ADR("CON:0/25/640/150/Lock/AUTO/WAIT/CLOSE"), newFile);
  62.     (* Ausgabefenster öffnen *)
  63.   FOR c := 0 TO AppMsgPtr^.numArgs - 1 DO
  64.     VolNamePtr := ADR(VolName);
  65.     CopyMem(ADDRESS(AppMsgPtr^.argList^[c].lock^.volume^.name),
  66.             VolNamePtr,
  67.             LONGINT(AppMsgPtr^.argList^[c].lock^.volume^.name^[0]) + 2);
  68.     (* Datenträger in VolName kopieren; er wird im BString-Format *)
  69.     (* geliefert, d. h. im ersten Zeichen steht die Länge des Strings *)
  70.     CASE AppMsgPtr^.id OF
  71.       0: LockArg := 'Lock ":" on';|   (* Menü "Lock on" ausgewählt *)
  72.       1: LockArg := 'Lock ":" off';   (* Menü "Lock off" ausgewählt *)
  73.     END;   (* CASE *)
  74.     BStrToStr(VolName);   (* Länge aus dem BString VolName eliminieren *)
  75.     Insert(LockArg, 6, VolName);   (* Befehl zusammensetzen *)
  76.     IF c = AppMsgPtr^.numArgs - 1 THEN   (* Asynchrone Ausführung nur beim *)
  77.       ASynch := TRUE;                    (* letzen Mal, damit man für alle *)
  78.     ELSE                                 (* Argumente das gleiche Fenster *)
  79.       ASynch := FALSE;                   (* verwenden kann und sich das Dos *)
  80.     END;   (* IF *)                      (* dann ums Schließen kümmert *)
  81.     Error := System(ADR(LockArg),   (* Ausführung *)
  82.                     TAG(tagbuf,
  83.                         sysInput, NIL,
  84.                         sysOutput, LONGINT(ShellPtr),
  85.                         sysASynch, ASynch,
  86.                         sysUserShell, TRUE,
  87.                         tagEnd));
  88.   END;   (* FOR *)
  89.   IF AppMsgPtr^.numArgs = 0 THEN     (* kein Icon ausgewählt? *)
  90.       Error := System(ADR("Lock"),   (* ==> Lock Fehlermeldung *)
  91.                       TAG(tagbuf,    (* ausgeben lassen *)
  92.                           sysInput, NIL,
  93.                           sysOutput, LONGINT(ShellPtr),
  94.                           sysASynch, TRUE,
  95.                           sysUserShell, TRUE,
  96.                           tagEnd));
  97.   END;   (* IF *)
  98. END ExecuteLock;
  99. BEGIN
  100.   PortPtr := CreatePort(ADR("Lock2AppMenu"), 0);   (* Message-Port *)
  101.   onPtr := AddAppMenuItemA(0, NIL, ADR("Lock on"), PortPtr, NIL);
  102.   offPtr := AddAppMenuItemA(1, NIL, ADR("Lock off"), PortPtr, NIL);
  103.     (* Application-Menüs einrichten *)
  104.   LOOP
  105.     WaitPort(PortPtr);   (* auf Message warten *)
  106.     REPEAT
  107.       AppMsgPtr := GetMsg(PortPtr);
  108.       IF AppMsgPtr^.type = appMenuItem THEN   (* Menü ausgewählt ? *)
  109.         ExecuteLock;                          (* ==> Lock ausführen *)
  110.       ELSIF (AppMsgPtr^.type = toolExit)
  111.              AND (AppMsgPtr^.userData = StopData) THEN   (* Stop-Nachricht? *)
  112.         ReplyMsg(AppMsgPtr);
  113.         EXIT;                                            (* ==> beenden *)
  114.       END;   (* IF *)
  115.       ReplyMsg(AppMsgPtr);
  116.     UNTIL IsMsgPortEmpty(PortPtr);
  117.   END;   (* LOOP *)
  118. END Launch;
  119.  
  120. PROCEDURE Remove;   (* Stop-Nachricht an laufendes Programm schicken *)
  121. BEGIN
  122.   PortPtr := CreatePort(NIL, 0);   (* Message-Port *)
  123.   AppMsgPtr := AllocVec(SIZE(AppMessage), MemReqSet{memClear});
  124.   WITH AppMsgPtr^ DO   (* Stop-Nachricht initialisieren *)
  125.     message.replyPort := PortPtr;
  126.     type := toolExit;
  127.     userData := StopData;
  128.   END;   (* WITH *)
  129.   PutMsg(ActivePortPtr, AppMsgPtr);   (* Nachricht schicken *)
  130.   WaitPort(PortPtr);   (* auf Bestätigung warten *)
  131.   FreeVec(AppMsgPtr);
  132. END Remove;
  133.  
  134. BEGIN   (* Main *)
  135.   IF kickVersion >= OS2 THEN   (* OS 2.0 oder höher vorhanden? *)
  136.     ActivePortPtr := FindPort(ADR("Lock2AppMenu"));
  137.         (* Message-Port des eventuell schon aktiven Programms suchen *)
  138.     IF ActivePortPtr = NIL THEN   (* Lock2AppMenu noch nicht aktiv *)
  139.       Launch;   (* also starten *)
  140.     ELSE   (* bereits aktiv *)
  141.       Remove;   (* also beenden *)
  142.     END;   (* IF *)
  143.   END;   (* IF *)
  144.  
  145. CLOSE   (* Ressourcen freigeben *)
  146.   IF onPtr # NIL THEN
  147.     ok := RemoveAppMenuItem(onPtr);
  148.   END;   (* IF *)
  149.   IF offPtr # NIL THEN
  150.     ok := RemoveAppMenuItem(offPtr);
  151.   END;   (* IF *)
  152.   IF PortPtr # NIL THEN
  153.     DeletePort(PortPtr);
  154.   END;   (* IF *)
  155.  
  156. END Lock2AppMenu.
  157.